# id是查找内存地址    # 变量名 = 值
num = 5
print(id(num))

# 特殊变量名命名规则     #出现绿（灰）色波浪线表示违反PEP8规范，无妨
name01 = name02 = '我'
a1, a2 = 100, 200
# 单词之间用下划线隔开
my_name = 'yangshuo'

# type()表示判断变量类型
url = 333
print(type(url))
url02 = 234.3
print(type(url02))

# 三重引号是保留格式输出的字符串类型
shi = """       
        静夜思
        唐                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          李白
    床前明月光，疑是地上霜
    举头望明月，低头思故乡
"""
print(shi)

url03: float = 3.14  # 明确当前变量类型，不过没必要，Python会自动检测
url04 = 'abc'  # 字符串要加引号
print(type(url04))

name = input('\n请输入你的名字：')     # 通过input函数输入的数据都是字符串类型
print(name)
print(type(name))

# 当input函数提示超过一行时，可使用运算符+=追加字符串
prompt = "\nIf your share your name,we can personalize the massages you see."
prompt += "\nWhat is your first name? "      # 问号后加空格，以便在终端显示时将提示与用户输入分开
name = input(prompt)
print(f"Hello,{name}!")

age = input('\n请输入你的年龄：')     # 输入类型转换，int转变成整数型
print(type(age))
age = int(age)
print(type(age))

# 占位符'%s'表示转换字符串（特殊格式化大部分时候使用这个）,格式化字符还可以使用f'{表达式}'
# '%d'表示转换有符号的十进制整数
# '%f'表示转换浮点数

my_screen_name = '云中'
my_hometown = '邵阳邵东'
my_hobby = '运动,阅读'
my_educational_background = '本科'
print('我的网名是%s' % my_screen_name)
print('我的家乡是%s，我的兴趣爱好是%s' % (my_hometown,my_hobby))    # 出现两个占位符就需要用括号按顺序排列
print(f'我的学历是{my_educational_background}')

money1 = 888
money2 = 77
print('我的金额是:%3d' % money2)  # d前的3表示数据调整为三位格

num = 22.345
print('%.2f' % num)  # '.2'表示浮点数精确到小数点后两位（有点粗略）

# 精确的四舍五入
from decimal import Decimal

num = 22.345
Decimal('22.345')  # 或者也可以写成Decimal(str(num))
print(Decimal(str(num)).quantize(Decimal('0.00'), rounding='ROUND_HALF_UP'))

s1 = 'I\'m Tom'  # 加上转义字符来打出缩写
print(s1)  # 或者写成s1 = "I'm Tom"也可
# 字符串最外层引号必须是英文

# 特殊的格式化
name = "胡歌"
age = 18
result = "帅哥{}今年{}岁".format(name,age)
print(result)

# 使用数字填充，从0开始计数
result = "帅哥{0}今年{1}岁,我也是{1}岁！".format(name,age)
print(result)

# 变量名的形式，format的参数必须是关键字参数
result = "帅哥{name}今年{age}岁,我也是{age}岁！".format(name ="胡歌",age = "18")
print(result)

# 字符串里既有单引号又有双引号，当字符串内容含有单引号，我们可以用双引号表示字符串
s2 = 'I\'m Tom'
num = f'{s2}'
print(num)

s3 = '我是“湖南”人'  # 字符串里既有单引号又有双引号，当字符串内容含有双引号，我们可以用单引号表示字符串

print(s1[4])  # 表示提取s1中的索引字符，转义字符在内容中不充当字符
# 列表的索引从0开始，因此查找列表中的第n个元素，索引值为n-1

# 交换两个变量的值
a = 2
b = 3
a,b = b,a
print(a,b)

s = 'abcdefg'
print(s[2:6:1])  # 表示切片操作，包头不包尾，第三个参数是步长设置
print(s[2:6])  # 正向下标
print(s[-5:-1])  # 反向下标，从右边数，从-1开始数
print(s[:4])  # 截取片段包含首字符，起始位置可忽略
print(s[3:])  # 截取片段包含末字符，结束位置可忽略
print(s[::-1])  # 字符串的倒序（或者使用reverse函数），方向是从右往左
print(s[0:7:-1])  # 从起始位置a开始从右往左，当然没数了，应该是print(s[7:0:-1])

# 字符串查询函数有find和index两种，若查找的某字符没有，find会显示-1，而index会直接报错
ss = 'abcdefghijk'
print(ss.find('fg'))  # 两种查询函数都是查到第一个所查字符即结束运行
print(ss.index('fg'))  # 两种函数除了查找还可以表判断，看看代码中有没有该字符
# 两种函数前面加了r表示反向查找

# for循环也可以遍历字符串（字符串也属于序列），计算以下字符串中的数字和
s = 0
for i in "d7f8dje93n3":
    if i.isdigit():
        s += int(i)
print(s)

# 字符串判断函数
sss = 'I am a student'
print(sss.startswith("are"))    # startswith()函数表示是否以()内数据开头
print(sss.endswith("student"))    # endswith()函数表示是否以()内数据结尾
print(sss.isalpha())        # isalpha()函数表示该字符串是否是纯字母组成
print(sss.isdigit())        # isdigit()函数表示该字符串是否是纯数字组成
print(sss.isalnum())        # isalnum()函数表示该字符串是否是字母和数字组成
print(sss.isspace())        # isspace()函数表示该字符串是否是一个空白的字符串
print(sss.isupper())        # isupper()函数表示判断字符串中的字母字符是否全部为大写
print(sss.islower())        # islower()函数表示判断字符串中的字母字符是否全部为小写
# 判断函数返回值均是布尔类型

'''
admin 13873952037 200633
用户名：全部小写，首字母不能是数字，长度必须在6位以上
手机号码：纯数字，长度11位
密码必须是6位数字
以上符合条件则进入下层验证：
判断用户名＋密码是否正确，否则登录失败
'''
flag = True
while flag:     # 使用变量更加灵活
    name = input("请输入用户名/手机号码：")
    if (name.islower() and name[0].isalpha and len(name) >= 6) or (name.isdigit() and len(name) == 11):
        # 继续输入密码，密码输入错误允许多次输入
        while True:
            password = input("请输入密码：")
            # 判断是否是6位数字
            if len(password) == 6 and password.isdigit():
                # 验证name+密码，正确性
                if (name == "admin" or name == "13873952037") and password == "200633":
                    print("用户登录成功！")
                    flag = False
                    break
                else:
                    print("用户名或者密码有误！")
                    break
            else:
                print("密码必须是6位数字")
    else:
        print("用户名或者手机号码格式错误！")

sss = 'I am a student'
print(sss.count("a"))    # 统计指定字符的个数
print(sss.split(' '))  # 切割，函数中间为分隔符，不会在结果中出现，返回结果是一个列表
print(sss.partition(' '))  # 分区，分隔符单独一个区
print(sss.replace("student", "boss",1))  # 字符串的替换,参数count是对替换次数的指定
print(sss.title())    # 将字符串里的每个单词首字母进行大写
print(sss.upper())    # 将字符串中的单词都进行大写
print(sss.lower())    # 将字符串中的单词都进行小写
print(sss.strip())    # 将原字符串中的空格删除后输出
print(sss.center(30))    # 给定30个字符，将字符串放在30个字符的中间位置

# 字母和数字的组合（验证码生成）
import random
file_name = ""
s = "QWERTYUIOPASDFGHJKLZXCVBNMqwertyuiopasdfghjklzxcvbnm1234567890"
for i in range(4):
    index = random.randint(0,len(s) - 1)     # 随机产生下标
    file_name += s[index]     # s[index]是为了获取下标匹配的字母
print(file_name)